package leetcode每日一题;

import java.util.Arrays;
import java.util.Comparator;

/**
 * 1，问题描述
 *  在一个XY 坐标系中有一些点，我们用数组coordinates来分别记录它们的坐标，
 *  其中coordinates[i] = [x, y]表示横坐标为 x、纵坐标为 y的点。
 *  请你来判断，这些点是否在该坐标系中属于同一条直线上，是则返回 true，否则请返回 false。
 *

 * 2，算法分析
 *
 * 3. 代码实现
 */
@SuppressWarnings("all")
public class 判断点是否在一条直线上 {
    public static void main(String[] args) {

    }

    // 比较斜率法
    public boolean checkStraightLine1(int[][] coordinates) {
        int len = coordinates.length; // 获取点的个数
        if(len == 0 || len == 1 || len == 2) {
            return true;
        }
        int tempdiffX = coordinates[1][0] - coordinates[0][0];
        if(tempdiffX == 0) {
            for(int i = 2; i < len; i++) {
                if(coordinates[i][0] - coordinates[0][0] != 0) {
                    return false;
                }
            }
            return true;
        }
        int tempdiffY = coordinates[1][1] - coordinates[0][1];
        if(tempdiffY == 0) {
            for(int i = 2; i < len; i++) {
                if(coordinates[i][1] - coordinates[0][1] != 0) {
                    return false;
                }
            }
            return true;
        }
        int diffX = coordinates[1][0] - coordinates[0][0];
        int diffY = coordinates[1][1] - coordinates[0][1];
        double scale = (double) diffY / diffX;
        for(int i = 2; i < len; i++) {
            int tempX = coordinates[i][0] - coordinates[0][0];
            int tempY = coordinates[i][1] - coordinates[0][1];
            double tempScale = (double) tempY / tempX;
            if(tempScale != scale) {
                return  false;
            }
        }
        return true;
    }

    // 直线的两点式  Ax + By = C
    // 向将直线进行平移，使得直线过原点，则此时的直线的方程可以简化为 Ax + By = 0
    // 我们直接判断当前平移之后的点是否满足Ax + By = 0
    public boolean checkStraightLine2(int[][] coordinates) {
        int len = coordinates.length; // 获取点的个数
        if(len == 0 || len == 1 || len == 2) {
            return true;
        }
        // 1. 将直线平移到过原点
        // 思路：将第一个点移动到原点，其横纵坐标的变化就是剩余点的变化
        int diffX0 = coordinates[0][0];
        int diffY0 = coordinates[0][1];
        for(int i = 0; i < len; i++) {
            coordinates[i][0] -= diffX0;
            coordinates[i][1] -= diffY0;
        }
        int A = coordinates[1][1] - coordinates[0][1];
        int B = coordinates[1][0] - coordinates[0][0];
        for(int i = 2; i < len; i++) {
            if(A*coordinates[i][0] - B*coordinates[i][1] != 0) {
                return false;
            }
        }
        return true;
    }
}
